/// <summary>
/// 模式匹配取代了大堆的难读的 if/else
/// 
/// 可使用模式匹配的语法结构：
/// is表达式 switch语句 switch表达式
/// 
/// c#支持的模式：
/// 声明模式：用于检查表达式的运行时类型，如果匹配成功，则将表达式结果分配给声明的变量。
/// 类型模式：用于检查表达式的运行时类型。 在 C# 9.0 中引入。
/// 常量模式：用于测试表达式结果是否等于指定常量。
/// 关系模式：用于将表达式结果与指定常量进行比较。 在 C# 9.0 中引入。
/// 逻辑模式：用于测试表达式是否与模式的逻辑组合匹配。 在 C# 9.0 中引入。
/// </summary>
public class 模式匹配
{
    public static void 练习()
    {
        // is表达式(42);

        // var param = 2;
        // System.Console.WriteLine(类型模式_switch表达式(param));

        // System.Console.WriteLine(声明模式_switch表达式(param));

        // System.Console.WriteLine(常量模式_switch表达式(param));

        // System.Console.WriteLine(关系模式_switch表达式(param));

        // System.Console.WriteLine(逻辑模式_switch表达式(param));

        人 param = new();
        System.Console.WriteLine(属性模式_switch表达式(param));
    }

    static void is表达式(object param)
    {
        // 类型模式
        // if (param is int)
        // {
        //     Console.WriteLine("param 参数是一个 int 变量");
        //     return;
        // }

        // 声明模式
        if (param is int number)
        {
            Console.WriteLine("param 参数是一个 int 变量");
            Console.WriteLine($"这个模式被匹配了并创建了新变量 number,它获取了 param 的值{number}");
            return;
        }
        Console.WriteLine("param 参数不是一个 int 变量");
    }

    static string 类型模式_switch表达式(object param) =>
        param switch
        {
            int => "参数 param 是 int 类型",
            float => "参数 param 是 float 类型",
            double => "参数 param 是 double 类型",
            short => "参数 param 是 short 类型",
            char => "参数 param 是 char 类型",
            byte => "参数 param 是 byte 类型",
            long => "参数 param 是 long 类型",
            string => "参数 param 是 string 类型",
            null => "参数 param 是 null 类型",
            _ => "参数 param 的类型未被匹配",
        };

    static string 声明模式_switch表达式(object param) =>
        param switch
        {
            int number => $"参数 param 是 int 类型, 声明的新变量 number 获取了它的值：{number}",
            _ => "参数 param 的类型未被匹配",
        };

    static string 常量模式_switch表达式(object param) => param switch
    {
        42 => "宇宙的答案",
        _ => "未匹配。。。",
    };

    /// 在关系模式中，可使用关系运算符<、>、<= 或 >= 中的任何一个。 
    /// 关系模式的右侧部分必须是常数表达式。 
    /// 常数表达式可以是 integer、floating-point、char 或 enum 类型。
    static string 关系模式_switch表达式(object param) => param switch
    {
        > 0 => "正数",
        < 0 => "负数",
        _ => "未匹配。。。",
    };

    // 从 C# 9.0 开始，可使用 not、and 和 or 模式连结符来创建以下逻辑模式：
    // 可使用括号指定判断优先级
    static string 逻辑模式_switch表达式(int param) => ++param switch
    {
        // not int => "参数非 int 整形",
        3 or 4 or 5 or 6 => "三或者四或者五或者六",
        > 0 and < 10 => "零到十之间",
        _ => "未匹配。。。",
    };

    static string 属性模式_switch表达式(人 param) => param switch
    {
        { name: "xiaoming", age: 23 } => "是小明",
        _ => "未匹配。。。"
    };

}

class 人
{
    public string name = "xiaoming";
    public int age = 24;
}